Lokale SQL

Die Borland Database Engine (BDE) ermöglicht Zugriff auf lokale und entfernte Datenbanktabellen durch die lokale SQL (Structured Query Lnaguage). Lokale SQL (auch Client-basierte SQL genannt) ist eine Teilmenge der ANSI-92-SQL, die auf die Unterstützung der Konventionen über Paradox- und dBase-Namengebung für Tabellen und Felder (die in der SQL "Spalten" heißen) erweitert wurde.

Die lokale SQL ermöglicht es Ihnen, "lokale" Standard-Datenbanktabellen abzufragen, die weder auf einem Datenbank-Server noch auf "entfernten" SQL-Servern vorgehalten werden (hauptsächlich Paradox- oder dBASE-Tabellen). Lokale SQL wird außerdem dazu benötigt Abfragen in mehrfachen Tabellen über sowohl lokale Standardtabellen als auch über Tabellen auf entfernten SQL-Servern auszuführen.

Namenskonventionen
Dieser Abschnitt beschreibt die Namenskonventionen für Tabellen und Spalten, die Syntaxerweiterungen und -beschränkungen für lokale SQL.

Die SQL-Anweisungen werden in zwei unterschiedliche Kategorien aufgeteilt, DLL (Data Definition Language, Datendefinitionssprache) und DML (Data Manipulation Language, Datenmanipulationssprache).

Datenmanipulation
SQL-Anweisungen in der Data Manipulation Language (DML, Datenmanipulationssprache) werden zum Auswählen, Einfügen, Aktualisieren und Löschen von Tabellendaten verwendet. Syntax- und Verwendungsbeispiele sind zur Veranschaulichung enthalten.

Datendefinition
SQL-Anweisungen werden in der Datendefinitionssprache DDL (Data Definition Language) dazu verwendet, um Tabellen zu erzeugen, zu ändern und zu löschen und um Indizes zu erzeugen und zu löschen.. Die DDL wandelt direkt in BDE-Funktionsaufrufe um. Syntax- und Einsatzbeispiele sind hierin enthalten.

Um eine vollständige Einführung in ANSI-Standard-SQL zu erhalten, informieren Sie sich bitte in einem der vielen Bücher von Drittanbietern.

 Andere BDE-Online-Dokumentation


Namenskonventionen

ANSI-Standard-SQL begrenzt den Tabellennnamen auf in einzelnes Wort, das aus alphanumerischen Zeichen und dem Unterstreichungsstrich (_) besteht. Die lokale SQL wurde so erweitert, daß sie verständlichere Namen unterstützt.

Tabellen

Die lokale SQL unterstütz vollständige Datei- und Pfadangaben für Tabellennamen. Tabellennamen mit Pfad- oder Dateinamenerweiterungen müssen in einfache oder doppelte Anführungszeichen gesetzt werden. Zum Beispiel:

SELECT * FROM 'PARTS.DBF'

SELECT * FROM "C:\SAMPLE\PARTS.DBF"

Lokale SQL unterstützt auch BDE-Aliasnamen für Tabellennamen. Zum Beispiel:

SELECT * FROM ":PDOX:TABLE1"

Falls Sie die Dateinamenerweiterung bei einem lokalen Tabellennamen auslassen, wird angenommen, daß diese Tabelle von dem Typ ist, der das BDE-Konfigurationsprogramm in der Treibervoreinstellung (Menu: Seite|System) oder im vorgegebenen Treibertyp für den Standard-Alias spezifiziert, der mit der Abfrage oder der Tabelle verbunden ist.

Schließlich erlaubt die lokale SQL, daß Tabellennamen SQL-Schlüsselwörtern gleichen, vorausgesetzt, diese Tabellennamen stehen in einfachen oder doppelten Anführungszeichen, wie beispielsweise:

SELECT PASSID FROM "PASSWORD"

Spalten

Die lokale SQL unterstützt Paradox-Spaltennamen mit mehreren Wörtern und -Spaltennamen, die SQL-Schlüsselwörter duplizieren, vorrausgesetzt diese Spaltennamen werden:

von einfachen oder doppelten Anführungszeichen umgeben

von einem SQL-Tabellennamen oder einem Tabellen-Korrelationsnamen angeführt

Der folgende Sapltenname besteht zum Beispiel aus zwei Wörtern:

SELECT E."Emp Id" FROM EMPLOYEE E

Im nächsten Beispiel dupliziert der Spaltenname das SQL-Schlüsselwort DATE:

SELECT DATELOG."DATE" FROM DATELOG

Siehe auch: Reservierte Wörter


Reservierte Wörter

Hier folgt eine alphabetische Liste der reservierten Wörter der lokalen SQL:

ACTIVE, ADD, ALL, AFTER, ALTER, AND, ANY, AS, ASC, ASCENDING, AT, AUTO, AUTOINC, AVG

BASE_NAME, BEFORE, BEGIN, BETWEEN, BLOB, BOOLEAN, BOTH, BY, BYTES

CACHE, CAST, CHAR, CHARACTER, CHECK, CHECK_POINT_LENGTH, COLLATE, COLUMN, COMMIT, COMMITTED, COMPUTED, CONDITIONAL, CONSTRAINT, CONTAINING, COUNT, CREATE, CSTRING, CURRENT, CURSOR

DATABASE, DATE, DAY, DEBUG, DEC, DECIMAL, DECLARE, DEFAULT, DELETE, DESC, DESCENDING, DISTINCT, DO, DOMAIN, DOUBLE, DROP

ELSE, END, ENTRY_POINT, ESCAPE, EXCEPTION, EXECUTE, EXISTS, EXIT, EXTERNAL, EXTRACT

FILE, FILTER, FLOAT, FOR, FOREIGN, FROM, FULL, FUNCTION

GDSCODE, GENERATOR, GEN_ID, GRANT, GROUP, GROUP_COMMIT_WAIT_TIME

HAVING, HOUR

IF, IN, INT, INACTIVE, INDEX, INNER, INPUT_TYPE, INSERT, INTEGER, INTO, IS, ISOLATION

JOIN

KEY

LONG, LENGTH, LOGFILE, LOWER, LEADING, LEFT, LEVEL, LIKE, LOG_BUFFER_SIZE

MANUAL, MAX, MAXIMUM_SEGMENT, MERGE, MESSAGE, MIN, MINUTE, MODULE_NAME, MONEY, MONTH

NAMES, NATIONAL, NATURAL, NCHAR, NO, NOT, NULL, NUM_LOG_BUFFERS, NUMERIC

OF, ON, ONLY, OPTION, OR, ORDER, OUTER, OUTPUT_TYPE, OVERFLOW

PAGE_SIZE, PAGE, PAGES, PARAMETER, PASSWORD, PLAN, POSITION, POST_EVENT, PRECISION, PROCEDURE, PROTECTED, PRIMARY, PRIVILEGES

RAW_PARTITIONS, RDB$DB_KEY, READ, REAL, RECORD_VERSION, REFERENCES, RESERV, RESERVING, RETAIN, RETURNING_VALUES, RETURNS, REVOKE, RIGHT, ROLLBACK

SECOND, SEGMENT, SELECT, SET, SHARED, SHADOW, SCHEMA, SINGULAR, SIZE, SMALLINT, SNAPSHOT, SOME, SORT, SQLCODE, STABILITY, STARTING, STARTS, STATISTICS, SUB_TYPE, SUBSTRING, SUM, SUSPEND

TABLE, THEN, TIME, TIMESTAMP, TIMEZONE_HOUR, TIMEZONE_MINUTE, TO, TRAILING, TRANSACTION, TRIGGER, TRIM

UNCOMMITTED, UNION, UNIQUE, UPDATE, UPPER, USER

VALUE, VALUES, VARCHAR, VARIABLE, VARYING, VIEW

WAIT, WHEN, WHERE, WHILE, WITH, WORK, WRITE

YEAR

OPERATOREN:

||, -, *, /, <>, <, >, ,(Komma), =, <=, >=, ~=, !=, ^=, (, )


Datenmanipulation

Mit einigen Einschränkungen unterstützt die lokale SQL die folgenden Anweisungen zur Datenmanipulation:

SELECT, um bestehende Daten zu erhalten

INSERT, um einer Tabelle neue Daten hinzuzufügen

UPDATE, um bestehende Daten zu ändern

DELETE, um bestehende Daten aus einer Tabelle zu entfernen

Der folgende Abschnitt beschreibt durch DML-Anweisungen verfügbare Funktionen in lokaler SQL.

Parameter-Substitution in DML-Anweisungen

Aggregatfunktionen

String-Funktionen

Datums-Funktionen

Operatoren

Aktualisierbare Abfragen

Weitere anschauliche Beispiele finden Sie unter:

DML-Beispiele


SELECT

Die Anweisung SELECT dient dem Abruf von Daten in einer oder mehreren Tabellen. Ein SELECT, das Daten aus mehreren Tabellen abruft, heißt "Join". Die lokale SQL unterstützt die folgende Form der Anweisung SELECT:

SELECT [DISTINCT] column_list

FROM table_reference

[WHERE search_condition]

[ORDER BY order_list]

[GROUP BY group_list]

[HAVING having_condition]

[UNION select_expr]

Alle Anweisungen werden wie in ANSI-Standard-SQL behandelt, außer wie unten angemerkt. Anweisungen in eckigen Klammern sind optional.

Die column_list zeigt die Spalten an, aus denen die Daten abzurufen sind. Beispielsweise ruft das folgende Beispiel Daten aus zwei Spalten ab:

SELECT PART_NO, PART_NAME

FROM PARTS

Wählen Sie eines der folgenden Themen, um mehr Informationen über die Verwendung von SELECT zu bekommen:

FROM-Klausel

WHERE-Klausel

ORDER BY-Klausel

GROUP BY-Klausel

HAVING-Klausel

UNION-Klausel

Heterogene Joins


FROM-Klausel

Die Klausel FROM gibt die Tabelle oder Tabellen an, aus denen Daten abzurufen sind. table_reference kann eine einzelne Tabelle, eine durch Kommata getrennte Aufzählung von Tabellen oder ein innerer oder äußerer Join im SQL-92-Standard sein. Als Beispiel gibt folgende Anweisung eine einzelne Tabelle an:

SELECT PART_NO

FROM "PARTS.DBF"

Die nächste Anweisung gibt eine linke äußere Verknüpfung für for table_reference an:

SELECT * FROM PARTS LEFT OUTER JOIN INVENTORY

ON PARTS.PART_NO = INVENTORY.PART_NO


WHERE-Klausel

Die optionale Klausel WHERE reduziert die von einer Abfrage zurückgegebene Anzahl von Zeilen auf diejenigen, die die in search_condition spezifizierten Kriterien erfüllen. Folgende Beispielanweisung ruft nur die Zeilen ab, in denen PART_NO größer als 543 ist:

SELECT * FROM PARTS

WHERE PART_NO > 543

Die Klausel WHERE kann das Prädikat IN, gefolgt von einer geklammerten Werteliste, enthalten. Die nächste Anweisung ruft zum Beispiel nur die Zeilen ab, in denen eine Teilenummer PART_NO einem Eintrag in der Prädikatenliste IN entspricht:

SELECT * FROM PARTS

WHERE PART_NO IN (543, 544, 546, 547)

Zusätzlich zu skalaren Vergleichsoperatoren ( =, <, > ... ) werden zusätzliche Prädikate unterstützt, die IN, ANY, ALL oder EXISTS verwenden.


ORDER BY-Klausel

Die Klausel ORDER BY gibt die Reihenfolge der abgerufenen Zeilen an. Beispielsweise ruft folgende Abfrage eine Aufzählung aller Teile, in aphabetischer Reihenfolge nach Teilenamen geordnet, ab:

SELECT * FROM PARTS

ORDER BY PART_NAME ASC

Die nächste Abfrage ruft alle Information über die Teile nach abfallender Teilenummer geordnet ab:

SELECT * FROM PARTS

ORDER BY PART_NO DESC

Berechnete Felder können nach Korrelationsnamen oder Ordinalposition geordnet werden. Folgende Abfrage zum Beispiel sortiert Zeilen nach dem berechneten Feld FULL_NAME:

SELECT LAST_NAME || `, ` || FIRST_NAME AS FULL_NAME, PHONE,

FROM CUSTOMER

ORDER BY FULL_NAME

Die Projektion aller gruppierenden oder anordnenden Spalten ist nicht erforderlich.


GROUP BY-Klausel

Die Klausel GROUP BY legt fest, wie erhaltene Zeilen für die Aggregatfunktionen gruppiert werden.


HAVING-Klausel

Die HAVING-Klausel legt Bedingungen fest, die Datensätze erfüllen müssen, um in der Rückgabe einer Abfrage einbezogen zu werden. Es handelt sich hierbei um einen bedingten Ausdruck, der gemeinsam mit der GROUP BY-Klausel verwendet wird. Gruppen, die dem Ausdruck in der HAVING-Klausel nicht entsprechen, sind nicht in der sich ergebenden Auswahl enthalten.

Unterabfragen werden in der HAVING-Klausel unterstützt. Eine Unterabfrage funktioniert wie eine Suchbedingung, um die Anzahl der Zeilen zu beschränken, die von der "äußeren" oder "Eltern-"Abfrage zurückgegeben werden. Siehe WHERE-Klausel

Zusätzlich zu skalaren Vergleichsoperatoren ( =, <; >,...) werden Prädikate unterstützt, die IN, ANY, ALL und EXISTS verwenden.


UNION-Klausel

Die Klausel UNION kombiniert das Ergebnis von zwei oder mehreren SELECT-Anweisungen, um eine einzelne Tabelle zu erzeugen.


Heterogene Joins

Die lokale SQL unterstützt Joins (Verknüpfungen) bei Tabellen in verschiedenen Datenbankformaten; ein solcher Join heißt "heterogener Join".

Wenn Sie einen heterogenen Join ausführen, können Sie einen lokalen Alias auswählen. Wählen Sie dazu SQL|Alias auswählen. Wählen sie keinen Alias versucht die lokale SQL die Tabelle im aktuellen Verzeichnis der momentan verwendeten Datenbank zu finden. Beispielsweise könnte der Alias :ARBEIT: der Datenbank-Handle sein, der in die Funktion übergeben wird.

Wenn Sie einen Tabellennamen vergeben, nachdem Sie einen lokalen Alias ausgewählt haben:

Spezifizieren Sie bei lokalen Tabellen entweder den Alias oder den Pfad.

Spezifizieren Sie bei nicht-lokalen Tabellen den Alias.

Die folgende Anweisung ruft Daten aus einer Paradox-Tabelle und einer dBASE-Tabelle ab:

SELECT DISTINCT C.CUST_NO, C.STATE, O.ORDER_NO

FROM "CUSTOMER.DB" C, "ORDER.DBF" O

WHERE C.CUST_NO = O.CUST_NO

BDE-Aliase können auch zusammen mit Tabellennamen verwendet werden.


INSERT

In lokaler SQL ist INSERT auf zwei Formen beschränkt:

INSERT INTO CUSTOMER (FIRST_NAME, LAST_NAME, PHONE)

VALUES(:fname, :lname, :phone_no)

Einfügen aus einer Tabelle in eine andere durch eine Unterabfrage ist nicht zugelassen.

Beispiele

Die folgende Anweisung fügt einer Tabelle eine Zeile hinzu, wobei zwei Spalten Werte zugewiesen werden.

INSERT INTO EMPLOYEE_PROJECT (EMP_NO, PROJ_ID) VALUES (52, "DGPII");

Die nächste Anweisung legt Werte fest, die in eine Tabelle mit einer SELECT-Anweisung eingefügt werden sollen.

INSERT INTO PROJECTS

    SELECT * FROM NEW_PROJECTS

          WHERE NEW_PROJECTS.START_DATE > "6-JUN-1994";


UPDATE

Es gibt keine Einschränkungen oder Erweiterungen der ANSI-Standard-Anweisung UPDATE.


DELETE

Es gibt keine Einschränkungen oder Erweiterungen der ANSI-Standard-Anweisung DELETE.


Parameter-Substitution in DML-Anweisungen

Variablen oder Parametermarkierungen (?) können in DML-Anweisungen anstelle von Werten verwendet werden. Variablen muß stets ein Doppelpunkt (:) vorangehen. Beispiel:

SELECT LAST_NAME, FIRST_NAME

FROM "CUSTOMER.DB"

WHERE LAST_NAME > :var1 AND FIRST_NAME < :var2


Aggregatfunktionen

Die folgenden Aggregatfunktionen in der ANSI-Standard-SQL stehen der lokalen SQL für den Abruf von Daten zur Verfügung:

SUM(), um alle numerischen Werte in einer Spalte zu summieren

AVG(), um den Durchschnitt aller von NULL verschiedenen numerischen Werte in einer Spalte zu berechnen

MIN() für die Bestimmung des kleinsten Wertes in einer Spalte

MAX() für die Bestimmung des größten Wertes in einer Spalte

COUNT(), um in einer Spalte die Anzahl der Werte zu zählen, die bestimmte Kriterien erfüllen

Komplexe Aggregatausdrücke werden unterstützt, wie z.B.:

      SUM( Field * 10 )

      SUM( Field ) * 10

      SUM( Field1 + Field2 )


String-Funktionen

Die lokale SQL unterstützt folgende Stringmanipulationen zum Abrufen, Einfügen und Aktualisieren in der ANSI-Standard-SQL:

UPPER() für die Umwandlung eines Strings in Großbuchstaben

LOWER() für die Umwandlung eines Strings in Kleinbuchstaben

TRIM() für die Entfernung von Wiederholungen eines bestimmten Zeichens von rechts, links oder von beiden Seiten her

SUBSTRING() für die Erstellung eine Teilzeichenkette aus einer Zeichenkette


Teilzeichenkette

SUBSTRING() nimmt eine Zeichenkette und erzeugt daraus eine Teilzeichenkette.

   SELECT SUBSTRING( CUSTNAME FROM 1 FOR 10 )  FROM CUSTOMER

Diese Abfrage gibt die ersten 10 zeichen der Spalte COLUMN zurück..


Datums-Funktionen

Die lokale SQL unterstützt die Funktion EXTRACT() für die Isolierung eines einzelnen numerischen Feldes aus einem Datum/Zeit-Feld unter Verwendung folgender Syntax:

EXTRACT (extract_field FROM field_name)

Die folgende Anweisung zum Beispiel extrahiert YEAR aus einem DATE-Feld:

SELECT EXTRACT(YEAR FROM HIRE_DATE)

FROM EMPLOYEE

Mit dieser Funktion lassen sich auch MONTH, DAY, HOUR, MINUTE und SECOND extrahieren.

Hinweis: 	EXTRACT unterstützt nicht die TIMEZONE_HOUR- oder TIMEZONE_MINUTE-Klauseln.


Operatoren

Lokale SQL unterstützt die folgenden Operatoren:

Typ	Operator

arithmetische Operatoren	+     -      *     /

Vergleichsoperatoren	<     >     =    <>     >=      =<
IS NULL   IS NOTNULL

logische Operatoren	AND     OR      NOT

String-Verkettungsoperator	||


Aktualisierbare Abfragen

SQL-Link bietet erweiterte Unterstützung für aktualisierbare Abfragen über einzelne und mehrfache Tabellen.

Folgende Einschränkungen beziehen sich auf Aktualisierungen:

Verbindende Felder können nicht aktualisiert werden

Wechseln des Index erzeugt einen Fehler

Einschränkungen für lebende Abfragen

Die Semantik lebender Abfragen für alle Methoden zur Datenmanipulation geben Cursor zurück, die funktionell und semantisch vergleichbar sind mit Cursor, die von der BDE-Funktion DbiOpenTable zurückgeben werden.

Abfragen oder Ansichten für einzelne Tabellen sind aktualisierbar, vorrausgesetzt:

Es gibt keine JOINs, UNIONs, INTERSECTs, oder MINUS-Operationen.

Es gibt kein DISTINCT-Schlüsselwort im SELECT. (Diese Einschränkung kann gelockert werden, wenn alle Felder eines einmaligen Index angezeigt werden. )

Alles in der SELECT-Klausel ist eine einfache Spaltenreferenz oder ein berechnetes Feld; eine Zusammenfassung ist nicht zulässig.

Die Tabellenreferenz in der FROM-Klausel ist entweder eine aktualisierbare Basistabelle oder eine aktualisierbare Ansicht.

Es gibt keine GROUP BY- oder HAVING-Klausel.

Es gibt keine Unterabfragen, die auf die Tabelle in der FROM-Klausel verweisen und es gibt keine korrelierten Unterabfragen.

Jede ORDER BY-Klausel kann mit einem Index zufriedengestellt werden.

Zusätzliche Einschränkungen können für Feld- oder Cursor-Methoden zutreffen. Wenn ein Index dazu verwendet wird, eine Order-Klausel zufriedenzustellen, gibt die BDE-Funktion DbiSwitchToIndex einen Fehler zurück.

Einschränkungen für lebende Joins

Lebende Joins sind von zusammengesetzten Cursor abhängig. Lebende Joins können nur verwendet werden, wenn:

Alle Joins sind äußere Joins von links nach rechts.

Alle Joins sind äquivalente Joins.

Alle Join-Bedingungen werden von Indizes zufriedengestellt (für Paradox und dBASE)

Die Ausgabereihenfolge nicht definiert ist.

Jede Tabelle im Join eine Basistabelle ist.

Die Abfrage keine Elemente enthält, die oben aufgelistet sind und die Aktualisierbarkeit von einzelnen Tabellen verhindern.

Beschränkungen

Sie können jede aktualisierbare Abfrage beschränken, indem Sie die Abfrage-Anweisungseigenschaft stmtCONSTRAINED vor der Ausführung auf TRUE setzen. Es wird dann ein Fehler zurückgegeben, wenn das Einfügen oder Ändern den neuen Datensatz dazu bringt aus der Ergebnismenge zu verschwinden.

Berechnete Felder

Für aktualisierbare Abfragen mit berechneten Feldern identifiziert eine zusätzliche Feldeigenschaft ein Ergebnisfeld sowohl als im Zustand Nur lesen als auch im Zustand Berechnet befindlich. Jeder Aufruf an die BDE-Funktion DbiPutField verursacht die erneute Berechnung aller abhängigen Felder.

BDE-Funktionsaufrufe auf Abfrageergebnisse

Wenn eine Abfrage einen Cursor zurückgibt, unterstützt dieser Cursor die Low-Level-Abfragefähigkeiten eines Cursors, der von der BDE-Funktion DbiOpenTable zurückgegeben wird vollständig. Somit können Filter und Feldzuordnungen zugewiesen werden, um das Ergebnis weiter zu verfeinern. Anders als Cursor von offenen Tabellen werden einige Operationen wie DbiAddIndex oder DbiSwitchToIndex nicht unterstüzt.


DML-Beispiele

Die folgenden Klauseln werden unterstützt:

  SELECT FROM, WHERE, ORDER BY, GROUP BY, und HAVING

Die folgenden Aggregate werden unterstützt:

  SUM, AVG, MIN, MAX, COUNT

Die folgenden Operatoren werden unterstützt:

  , -, *, /, =, < >, IS NULL

UPDATE-, INSERT-, DELETE-Operationen werden vollständig unterstützt.

Die folgenden Beispiele zeigen DML-Anweisungen, die mit Standard-Datenbanken verwendet werden:

Beispiel 1: UPDATE

update goods
set city = 'Santa Cruz'
where goods.city = 'Scotts Valley'

Beispiel 2: INSERT

insert
into goods ( part_no, city )
values ( 'aa0094', 'San Jose' )

Beispiel 3: DELETE

delete
from goods
where part_no = 'aa0093'

Beispiel 4: SELECT zur Zusammenführung verwenden

Das folgende Beispiel zeigt, wie die SELECT-Anweisung als Äquivalent zu einem JOIN unterstützt wird:

select distinct p.part_no, p.quantity, g.city
from parts p, goods g
where p.part_no = g.part_no
and p.quantity > 20
order by p.quantity, g.city, p.part_no

Eine SELECT-Anweisung, die ein Join enthält, muß eine WHERE-Klausel umfassen, in der zumindest ein Feld aus jeder Tabelle in einer Überprüfung auf Gleichheit einbezogen ist.

Beispiel 5: Sub-Select

Sub-Select-Abfragen werden unterstüzt. Das folgende Beispiel veranschaulicht diese Syntax:

select p.part_no
from parts p
where p.quantity in
(select i.quantity
from inventory i
where  i.part_no = 'aa9393')

Beispiel 6: GROUP BY

Das folgende Beispiel zeigt die GROUP BY-Klausel:

select part_no, sum(quantity) as PQTY
from parts
group by part_no

Hinweis:	Aggregate in der SELECT-Klausel müssen eine GROUP BY-Klausel besitzen, wenn ein projeziertes Feld verwendet wird, so wie im ersten Beispiel dargestellt.

Beispiel 7: ORDER BY

Das folgende Beispiel veranschaulicht die Klausel ORDER BY mit einer DESCENDING-Klausel:

select distinct customer_no
from c:\data\customer
order by customer_no descending


Datendefinition

Die lokale SQL unterstützt die Datendefinitionssprache (DDL) für das Erzeugen, die Änderung und das Löschen von Tabellen sowie die Erzeugung und das Löschen von Indizes.

Ansichten werden unterstützt.

Die lokale SQL erlaubt nicht das Ersetzen von Werten durch Variablen in DDL-Anweisungen.

Die folgenden DDL-Anweisungen weden unterstützt:

CREATE TABLE

ALTER TABLE

DROP TABLE

CREATE INDEX

DROP INDEX

CREATE VIEW

Weitere anschauliche Beispiele finden Sie unter:

DDL-Beispiele


CREATE TABLE

CREATE TABLE wird unter den folgenden Einschränkungen unterstützt:

Spaltendefinitionen auf der Grundlage von Wertebereichen werden nicht unterstützt.

Restriktionen sind für Paradox auf PRIMARY KEY beschränkt. Restriktionen werden in dBase nicht unterstützt.

Beispielsweise erzeugt folgende Anweisung eine Paradox-Tabelle mit der Restriktion PRIMARY KEY auf den Spalten LAST_NAME und FIRST_NAME:

CREATE TABLE "employee.db"

(

LAST_NAME CHAR(20),

FIRST_NAME CHAR(15),

SALARY NUMERIC(10,2)

DEPT_NO SMALLINT,

PRIMARY KEY(LAST_NAME, FIRST_NAME)

)

Die gleiche Anweisung für eine dBase-Tabelle sollte die Definition von PRIMARY KEY auslassen:

CREATE TABLE "employee.db"

(

LAST_NAME CHAR(20),

FIRST_NAME CHAR(15),

SALARY NUMERIC(10,2)

DEPT_NO SMALLINT,

)

Erzeugen von Paradox- und dBASE-Tabellen

Sie erzeugen eine Paradox- oder dBASE-Tabelle mit Hilfe von lokaler SQL, indem Sie die Dateinamenserweiterung bei der Benennung der Tabelle angeben:

".DB" für Paradox-Tabellen

".DBF" für dBASE-Tabellen

Wenn Sie die Dateinamenerweiterung bei einer lokalen Tabelle auslassen, wird eine Tabelle von dem Typ erstellt, der in der Treibervoreinstellung der Seite System des BDE-Konfigurationsprogramms spezifiziert wurde.

Datentypabbildungen für CREATE TABLE

Die folgende Tabelle zählt die SQL-Syntax für Datentypen auf, die bei CREATE TABLE verwendet werden, und beschreibt, wie diese Typen vom BDE auf Paradox- und dBase-Typen abgebildet werden:

SQL-Syntax	BDE Logisch	Paradox	dBASE
SMALLINT	fldINT16	Short	Zahl (6,10)
INTEGER	fldINT32	Long Integer	Zahl (20,4)
DECIMAL(x,y)	fldBCD	BCD	N/A
NUMERIC(x,y)	fldFLOAT	Zahl	Zahl (x,y)
FLOAT(x,y)	fldFLOAT	Zahl	Float (x,y)
CHARACTER(n)	fldZSTRING	Alpha	Zeichen
VARCHAR(n)	fldZSTRING	Alpha	Zeichen
DATE	fldDATE	Datum	Datum
BOOLEAN	fldBOOL	Logisch	Logisch
BLOB(n,1)	fldstMEMO	Memo	Memo
BLOB(n,2)	fldstBINARY	Binär	Binär
BLOB(n,3)	fldstFMTMEMO	Formatierte Memo	N/A
BLOB(n,4)	fldstOLEOBJ	OLE	OLE
BLOB(n,5)	fldstGRAPHIC	Graphik	N/A
TIME	fldTIME	Zeit	N/A
TIMESTAMP	fldTIMESTAMP	Zeitmarke	N/A
MONEY	fldFLOAT, fldstMONEY	Geld	Zahl (20,4)
AUTOINC	fldINT32, fldstAUTOINC	Autoincrement	N/A
BYTES(n)	fldBYTES(n)	Bytes	N/A
x = Präzision (Standard:Treiberabhängig);

y = Skalierung (Standard: 0);

n = Länge in Bytes (Standard: 0);

1-5 = BLOB-Untertyp (Standard: 1)


ALTER TABLE

Die lokale SQL unterstützt die folgende Teilmenge der ANSI-Standard-Anweisung ALTER TABLE. Neue Spalten können einer bestehenden Tabelle unter Verwendung dieser ALTER TABLE-Syntax hinzugefügt werden:

ALTER TABLE table ADD column_name data_type [, ADD column_name data_type . . .]

Als Beispiel fügt folgende Anweisung einer dBase-Tabelle eine Spalte hinzu:

ALTER TABLE "employee.dbf" ADD BUILDING_NO SMALLINT

Bestehende Spalten können mit folgender ALTER TABLE-Syntax aus einer Tabelle gelöscht werden:

ALTER TABLE table DROP column_name [, DROP column_name . . .]

Beispielsweise entledigt die nächste Anweisung eine Paradox-Tabelle zweier Spalten:

ALTER TABLE "employee.db" DROP LAST_NAME, DROP FIRST_NAME

ADD- und DROP-Operationen können in einer einzigen Anweisung kombiniert werden. Die folgende Anweisung zum Beispiel löscht zwei Spalten und fügt eine neue hinzu:

ALTER TABLE "employee.dbf" DROP LAST_NAME, DROP FIRST_NAME, ADD FULL_NAME CHAR[30]


DROP TABLE

DROP TABLE löscht eine Paradox- oder dBASE-Tabelle, wie folgende Anweisung zum Beispiel eine Paradox-Tabelle:

DROP TABLE "employee.db"


CREATE INDEX

CREATE INDEX ermöglicht dem Benutzer die Erzeugung von Indizes auf Tabellen unter Verwendung folgender Syntax:

CREATE INDEX index_name ON table_name (column [, column . . .])

Die Verwendung von CREATE INDEX ist die einzige Möglichkeit, Indizes für dBase-Tabellen zu erzeugen. Die folgende Anweisung zum Beispiel tut dies:

CREATE INDEX NAMEX ON "employee.dbf" (LAST_NAME)

Paradox-Anwender können nur sekundäre Indizes mit CREATE INDEX erzeugen. Primäre Paradox-Indizes können nur durch Angabe einer PRIMARY KEY-Restriktion beim Anlegen einer neuen Tabelle mit CREATE TABLE erzeugt werden.


DROP INDEX

Die lokale SQL bietet folgende Abwandlung der ANSI-Standard-Anweisung DROP INDEX für das Löschen eines Index. Sie wurde so abgewandelt, daß sie dBase- und Paradox-Dateinamen unterstützt.

DROP INDEX table_name.index_name | PRIMARY

Das Schlüsselwort PRIMARY wird zum Löschen eines Primärindex in Paradox benutzt. Folgende Anweisung löscht beispielsweise den Primärindex von EMPLOYEE.DB:

DROP INDEX "employee.db".PRIMARY

Um einen beliebigen dBASE-Index oder sekundäre Paradox-Indizes zu löschen, gibt man den Inexnamen an. Zum Beispiel löscht die nächste Anweisung einen Sekundärindex aus einer Paradox-Tabelle:

DROP INDEX "employee.db".NAMEX


CREATE VIEW

Eine Ansicht erstellt eine virtuelle Tabelle von einer SELECT-Anweisung. Sie können genau die Daten betrachten, die Sie innerhalb dieses verschiebbaren Rahmens oder Fensters für diese Tabelle benötigen, während die technischen Grundlagen verborgen bleiben. Anstatt komplexe SELECT-Anweisungen einzugeben, wählt der Anwender nur eine Ansicht.

CREATE VIEW beschreibt eine Datenansicht, die auf einer oder mehreren zugrundeliegenden Tabellen in einer Datenbank basieren. Die zurückzugebenden Zeilen werden durch eine SELECT-Anweisung festgelegt, die Spalten aus der Quelltabelle auflistet. Eine Ansicht stellt physisch gespeicherte Daten nicht direkt dar. Es ist möglich Select-, Project-, Join- und Union-Operationen mit Ansichten durchzuführen, als ob es sich dabei um Tabellen handeln würde.

CREATE VIEW ermöglicht es dem Anwender Ansichten von Tabellen zu erstellen, indem die folgende Syntax verwendet wird:

CREATE VIEW view_name [ (column_name [, column_name]...)]

CREATE VIEW wird im Zusammenhang mit der Client Data Repository (CDR) unterstützt. Die CDR lagert die SELECT-Anweisung, die die Ansicht definiert.

"WITH CHECK OPTION" wird unterstützt, um eine beschränkte Ansicht zu erstellen.

Ansichten von Ansichten werden ebenfalls unterstützt. Das Ansichtsattribut CASCADE/LOCAL wird nicht unterstützt, da alle aktualisierbaren Ansichten die Beschränkungen unterteilen.


DDL-Beispiele

Die folgenden Beispiele zeigen die Verwendung der DDL-Anweisungen mit Standard-Datenbanken.

Beispiel 1a: DDL (DROP TABLE)

Wenn der Tabellenname ein Punktzeichen "." enthält, schließen Sie den Namen in Anführungszeichen ein:

drop table "c:\data\customer.db"

Beispiel 1b: DDL (DROP TABLE)

Es werden keine Anführungszeichen verwendet, wenn der Tabellenname nicht das Zeichen "." enthält:

drop table clients

Beispiel 2: DDL (CREATE INDEX)

create index part on parts (part_no)

Paradox: Die primären Indizes von Paradox können nur erstellt werden, wenn die Tabelle erstellt wird. Die sekundären Indizes werden, wenn möglich, unabhängig von der Groß- oder Kleinschreibung erstellt und beibehalten.

dBASE: dBASE-Indizes werden so erstellt, wie sie aufgestellt wurden. Der angegebene Indexname ist der Tag-Name.

Weitere Informationen über unterschiedliche Indextypen finden Sie unter DbiAddIndex in der Online-Referenz der Borland Database Engine.

Beispiel 3: DDL (DROP INDEX)

Die Syntax für Drop Index ist tablename.indexname:

drop index parts.part_no

Paradox: Nur für Paradox zeigt die Syntax tablename.primary den primären Index an:

drop index parts.primary